/* 
当我们封装axios的时候就会发现直接用axios实例去.then时发现他的res的类型为AxiosResponse，这个类型axios抛了出来
export interface AxiosResponse<T = any, D = any>  {
    data: T;
    status: number;
    statusText: string;
    headers: RawAxiosResponseHeaders | AxiosResponseHeaders;
    config: AxiosRequestConfig<D>;
    request?: any;
}

看这个类型可以发现他的data其实就是后端返回值的类型，这个类型需要通过第一个泛型传递过去，我们发现它还有第二个泛型D这个D又是什么呢我们可以去看AxiosRequestConfig这个类型
export interface AxiosRequestConfig<D = any> {
    url?: string;
    method?: Method | string;
    baseURL?: string;
    transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[];
    transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[];
    headers?: RawAxiosRequestHeaders;
    params?: any;
    paramsSerializer?: ParamsSerializerOptions;
    data?: D;
    ....
}
通过查看axios中的这个类型我们就会发现AxiosRequestConfig的泛型其实就是我们传递参数的类型所以我们可以通过这种方式去封装一下
我们可以先对axios的实例进行封装 
*/
import axios,{AxiosInstance} from 'axios'
import  { ElMessage } from 'element-plus'
import { useloginStore } from '@/store/usePinia2' 
// 创建类
export class Interceptors{
    // 创建属性[instance]以[AxiosInstance]为约束,
    instance:AxiosInstance
    // 构造器
    constructor(){
        // 创建实例axios
        this.instance = axios.create({
            // baseURL:'http://gmall-h5-api.atguigu.cn',
            baseURL:'/api',
            timeout:5000,
            headers:{
                "Content-type":"application/json;charset:utf-8"
            },
        })
    }
    // 初始化拦截器
    init(){
        // 请求拦截器
        this.instance.interceptors.request.use(
            (config)=>{
                // 请求携带token [可简化] 
                const loginToken = useloginStore()//获取仓库管理的token
                if (loginToken.token) {  
                    // config.headers.Authorization = `Bearer ${token.token}`//根据情况携带token 
                    config.headers['token'] = `${JSON.parse(sessionStorage.getItem('token')).token}`
                }
                return config
            },
            (error)=>{
                console.log(error); 
            }
        )
        // 响应拦截器
        this.instance.interceptors.response.use(
            // 响应结果 
            (response)=>{  
                return response
            },
            // 响应错误
            (error)=>{ 
                return Promise.reject(error)
            }
        )
    }
    // 返回给类[返回一下]
    getInterceptors(){
        // 初始化
        this.init()
        // 返给方法
        return this.instance
    }
}
